#!/bin/bash

# Ubuntu 22.04 物业保洁系统一键部署脚本
# 使用方法：在远程Ubuntu服务器上执行此脚本

set -e

echo "🚀 开始物业保洁系统远程部署..."

# 颜色定义
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
BLUE='\033[0;34m'
NC='\033[0m'

# 打印带颜色的信息
print_info() {
    echo -e "${BLUE}[INFO]${NC} $1"
}

print_success() {
    echo -e "${GREEN}[SUCCESS]${NC} $1"
}

print_warning() {
    echo -e "${YELLOW}[WARNING]${NC} $1"
}

print_error() {
    echo -e "${RED}[ERROR]${NC} $1"
}

# 检查是否为Ubuntu 22.04
check_os() {
    if [[ $(lsb_release -rs) != "22.04" ]]; then
        print_warning "建议使用Ubuntu 22.04，当前版本：$(lsb_release -rs)"
    fi
    print_success "操作系统检查通过"
}

# 更新系统
update_system() {
    print_info "正在更新系统..."
    sudo apt update && sudo apt upgrade -y
    print_success "系统更新完成"
}

# 安装Docker
install_docker() {
    print_info "正在安装Docker..."
    
    # 检查Docker是否已安装
    if command -v docker &> /dev/null; then
        print_success "Docker已安装: $(docker --version)"
    else
        sudo apt install -y docker.io docker-compose
        sudo systemctl start docker
        sudo systemctl enable docker
        sudo usermod -aG docker $USER
        print_success "Docker安装完成"
    fi
}

# 安装Java 17
install_java() {
    print_info "正在安装Java 17..."
    
    if command -v java &> /dev/null; then
        print_success "Java已安装: $(java -version 2>&1 | head -n1)"
    else
        sudo apt install -y openjdk-17-jdk
        print_success "Java 17安装完成"
    fi
}

# 安装Node.js
install_nodejs() {
    print_info "正在安装Node.js..."
    
    if command -v node &> /dev/null; then
        print_success "Node.js已安装: $(node --version)"
    else
        curl -fsSL https://deb.nodesource.com/setup_18.x | sudo -E bash -
        sudo apt install -y nodejs
        print_success "Node.js安装完成"
    fi
}

# 安装其他必要工具
install_tools() {
    print_info "正在安装必要工具..."
    sudo apt install -y curl wget git vim htop net-tools ufw
    print_success "工具安装完成"
}

# 设置防火墙
setup_firewall() {
    print_info "正在配置防火墙..."
    
    # 检查UFW状态
    if ! sudo ufw status | grep -q "Status: active"; then
        sudo ufw allow 22/tcp
        sudo ufw allow 80/tcp
        sudo ufw allow 443/tcp
        sudo ufw allow 3000/tcp
        sudo ufw allow 8080/tcp
        sudo ufw --force enable
        print_success "防火墙配置完成"
    else
        print_success "防火墙已配置"
    fi
}

# 创建项目目录
setup_project() {
    print_info "正在设置项目目录..."
    
    PROJECT_DIR="$HOME/property-cleaning-system"
    
    if [[ -d "$PROJECT_DIR" ]]; then
        print_warning "项目目录已存在: $PROJECT_DIR"
    else
        mkdir -p "$PROJECT_DIR"
        print_success "项目目录创建完成: $PROJECT_DIR"
    fi
    
    cd "$PROJECT_DIR"
}

# 下载项目文件
download_project() {
    print_info "正在准备项目文件..."
    
    # 这里假设您会通过SCP上传文件，或者从Git仓库克隆
    # 如果是通过SCP上传，请跳过此步骤
    
    # 示例：从Git仓库克隆（如果需要）
    # git clone [您的仓库地址] .
    
    print_success "项目文件准备完成"
}

# 设置文件权限
set_permissions() {
    print_info "正在设置文件权限..."
    chmod +x deploy.sh check-env.sh quick-test.sh 2>/dev/null || true
    print_success "文件权限设置完成"
}

# 环境检查
run_check() {
    print_info "正在运行环境检查..."
    if [[ -f "./check-env.sh" ]]; then
        ./check-env.sh
    else
        print_warning "环境检查脚本不存在，跳过"
    fi
}

# 部署应用
deploy_application() {
    print_info "正在部署应用..."
    
    # 询问部署环境
    echo "请选择部署环境："
    echo "1) 开发环境 (dev)"
    echo "2) 测试环境 (test)"
    echo "3) 生产环境 (prod)"
    read -p "请输入选择 (1-3): " choice
    
    case $choice in
        1) ENV="dev" ;;
        2) ENV="test" ;;
        3) ENV="prod" ;;
        *) ENV="dev" ;;
    esac
    
    print_info "开始部署 $ENV 环境..."
    
    if [[ -f "./deploy.sh" ]]; then
        ./deploy.sh $ENV
    else
        print_info "使用Docker Compose部署..."
        docker-compose up -d
    fi
    
    print_success "应用部署完成"
}

# 运行测试
run_tests() {
    print_info "正在运行测试..."
    
    # 等待服务启动
    sleep 10
    
    if [[ -f "./quick-test.sh" ]]; then
        ./quick-test.sh
    else
        print_info "手动检查服务状态..."
        docker ps
    fi
    
    print_success "测试完成"
}

# 显示访问信息
show_access_info() {
    print_info "部署完成！访问信息："
    
    # 获取公网IP（如果可能）
    PUBLIC_IP=$(curl -s ifconfig.me 2>/dev/null || echo "localhost")
    
    echo "=========================================="
    echo "🌐 前端访问: http://$PUBLIC_IP:3000"
    echo "🔧 后端API: http://$PUBLIC_IP:8080"
    echo "📚 API文档: http://$PUBLIC_IP:8080/swagger-ui.html"
    echo "=========================================="
    
    # 显示本地IP
    LOCAL_IP=$(hostname -I | awk '{print $1}')
    echo "🏠 本地访问: http://$LOCAL_IP:3000"
}

# 创建监控脚本
create_monitor() {
    print_info "创建监控脚本..."
    
    cat > ~/monitor-property.sh << 'EOF'
#!/bin/bash
echo "=== 物业保洁系统监控 ==="
echo "📊 系统资源:"
echo "CPU: $(top -bn1 | grep "Cpu(s)" | awk '{print $2}' | cut -d'%' -f1)%"
echo "内存: $(free -h | awk 'NR==2{printf "%.1f%%", $3*100/$2 }')"
echo "磁盘: $(df -h / | awk 'NR==2{print $5}')"

echo ""
echo "🐳 容器状态:"
docker ps --format "table {{.Names}}\t{{.Status}}\t{{.Ports}}"

echo ""
echo "🔌 服务端口:"
sudo netstat -tlnp | grep -E '8080|3000|3306' || echo "端口检查完成"
EOF

    chmod +x ~/monitor-property.sh
    print_success "监控脚本创建完成: ~/monitor-property.sh"
}

# 主执行流程
main() {
    echo "🎯 Ubuntu 22.04 物业保洁系统一键部署"
    echo "======================================"
    
    check_os
    update_system
    install_tools
    install_docker
    install_java
    install_nodejs
    setup_firewall
    setup_project
    download_project
    set_permissions
    run_check
    deploy_application
    run_tests
    show_access_info
    create_monitor
    
    echo ""
    print_success "🎉 部署完成！"
    print_info "使用 ~/monitor-property.sh 查看系统状态"
    print_info "使用 docker-compose logs -f 查看实时日志"
}

# 错误处理
trap 'print_error "部署过程中出现错误，请检查日志"; exit 1' ERR

# 执行主流程
main